<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>对象的扩展</title>
	</head>
	<body>
		<script type="text/javascript">
			// ES6 允许在大括号里面，直接写入变量和函数，作为对象的属性和方法。这样的书写更加简洁
			const foo = 'bar';
			const baz = {
				foo
			}; // 等同于 const baz = {foo: foo};

			/* 等同于
			 * const o = {
			 *	method: function() {
			 *	  return "Hello!";
			 *	}
			 * };
			 */
			const o = {
				method() {
					return "Hello!";
				}
			};

			// ES6 允许字面量定义对象或方法时，用表达式作为属性名或方法名，即把表达式放在方括号内
			let lastWord = 'last word';
			const obj = {
				'first word': 'a',
				[lastWord]: 'b',
				['h' + 'ello']() {
					return 'hi';
				}
			};
			obj['first word'] // "a"
			obj[lastWord] // "b"
			obj['last word'] // "b"
			obj.hello() // hi

			// ES6 一共有 5 种方法可以遍历对象的属性
			//（1）for...in
			//（2）Object.keys(obj)
			//（3）Object.getOwnPropertyNames(obj)
			//（4）Object.getOwnPropertySymbols(obj)
			//（5）Reflect.ownKeys(obj)

			// 我们知道，this关键字总是指向函数所在的当前对象，ES6 又新增了另一个类似的关键字super，指向当前对象的原型对象
			const proto = {
				foo: 'hello'
			};
			const object = {
				foo: 'world',
				find() {
					return super.foo;
				}
			};
			Object.setPrototypeOf(object, proto);
			object.find() // "hello"
			
			// 解构赋值的一个用处，是扩展某个函数的参数，引入其他操作
			function baseFunction({ a, b }) {
			  // ...
			}
			function wrapperFunction({ x, y, ...restConfig }) {
			  // 使用 x 和 y 参数进行操作
			  // 其余参数传给原始函数
			  return baseFunction(restConfig);
			}
		</script>
	</body>
</html>
